#include <stdio.h>
#include "gio.h"
#include "drvIO.h"
#include "drvPinconf.h"
#include "drvRTI.h"

/* DI板卡数字输入量管脚配置 */
PIN_CON_T DIConfigIn[DI_CHANNLE_LEN] =
{
    {DI_MCU_01_PORT, DI_MCU_01_NO},
    {DI_MCU_02_PORT, DI_MCU_02_NO},
    {DI_MCU_03_PORT, DI_MCU_03_NO},
    {DI_MCU_04_PORT, DI_MCU_04_NO},
    {DI_MCU_05_PORT, DI_MCU_05_NO},
    {DI_MCU_06_PORT, DI_MCU_06_NO},
    {DI_MCU_07_PORT, DI_MCU_07_NO},
    {DI_MCU_08_PORT, DI_MCU_08_NO},
    {DI_MCU_09_PORT, DI_MCU_09_NO},
    {DI_MCU_10_PORT, DI_MCU_10_NO},
    {DI_MCU_11_PORT, DI_MCU_11_NO},
    {DI_MCU_12_PORT, DI_MCU_12_NO},
    {DI_MCU_13_PORT, DI_MCU_13_NO},
    {DI_MCU_14_PORT, DI_MCU_14_NO},
    {DI_MCU_15_PORT, DI_MCU_15_NO},
    {DI_MCU_16_PORT, DI_MCU_16_NO},
    {DI_MCU_17_PORT, DI_MCU_17_NO},
    {DI_MCU_18_PORT, DI_MCU_18_NO},
    {DI_MCU_19_PORT, DI_MCU_19_NO},
    {DI_MCU_20_PORT, DI_MCU_20_NO},
    {DI_MCU_21_PORT, DI_MCU_21_NO},
    {DI_MCU_22_PORT, DI_MCU_22_NO},
};

/* DI板卡数字输入量动态采集控制管脚配置 */
PIN_CON_T DIConfigCtrl[DI_DRVC_LEN] =
{
    {DI_DRVC_1_PORT, DI_DRVC_1_NO},
    {DI_DRVC_2_PORT, DI_DRVC_2_NO},
    {DI_DRVC_3_PORT, DI_DRVC_3_NO},
    {DI_DRVC_4_PORT, DI_DRVC_4_NO},
    {DI_DRVC_5_PORT, DI_DRVC_5_NO},
    {DI_DRVC_6_PORT, DI_DRVC_6_NO},
};

/* DO板卡数字输出量管脚配置 */
PIN_CON_T DOConfigCtrl[DO_CHANNLE_LEN*2] =
{
    {DO_NOTYPE1_01_PORT, DO_NOTYPE1_01_NO},
    {DO_NOTYPE1_02_PORT, DO_NOTYPE1_02_NO},
    {DO_NOTYPE1_03_PORT, DO_NOTYPE1_03_NO},
    {DO_NOTYPE1_04_PORT, DO_NOTYPE1_04_NO},
    {DO_NOTYPE1_05_PORT, DO_NOTYPE1_05_NO},
    {DO_NOTYPE1_06_PORT, DO_NOTYPE1_06_NO},
    {DO_NOTYPE1_07_PORT, DO_NOTYPE1_07_NO},
    {DO_NOTYPE1_08_PORT, DO_NOTYPE1_08_NO},
    {DO_NOTYPE1_09_PORT, DO_NOTYPE1_09_NO},
    {DO_NOTYPE1_10_PORT, DO_NOTYPE1_10_NO},
    {DO_NOTYPE1_11_PORT, DO_NOTYPE1_11_NO},
    {DO_NOTYPE1_12_PORT, DO_NOTYPE1_12_NO},
    {DO_NOTYPE1_13_PORT, DO_NOTYPE1_13_NO},
    {DO_NOTYPE1_14_PORT, DO_NOTYPE1_14_NO},
    {DO_NOTYPE1_15_PORT, DO_NOTYPE1_15_NO},
    {DO_NOTYPE1_16_PORT, DO_NOTYPE1_16_NO},
    {DO_NOTYPE2_01_PORT, DO_NOTYPE2_01_NO},
    {DO_NOTYPE2_02_PORT, DO_NOTYPE2_02_NO},
    {DO_NOTYPE2_03_PORT, DO_NOTYPE2_03_NO},
    {DO_NOTYPE2_04_PORT, DO_NOTYPE2_04_NO},
    {DO_NOTYPE2_05_PORT, DO_NOTYPE2_05_NO},
    {DO_NOTYPE2_06_PORT, DO_NOTYPE2_06_NO},
    {DO_NOTYPE2_07_PORT, DO_NOTYPE2_07_NO},
    {DO_NOTYPE2_08_PORT, DO_NOTYPE2_08_NO},
    {DO_NOTYPE2_09_PORT, DO_NOTYPE2_09_NO},
    {DO_NOTYPE2_10_PORT, DO_NOTYPE2_10_NO},
    {DO_NOTYPE2_11_PORT, DO_NOTYPE2_11_NO},
    {DO_NOTYPE2_12_PORT, DO_NOTYPE2_12_NO},
    {DO_NOTYPE2_13_PORT, DO_NOTYPE2_13_NO},
    {DO_NOTYPE2_14_PORT, DO_NOTYPE2_14_NO},
    {DO_NOTYPE2_15_PORT, DO_NOTYPE2_15_NO},
    {DO_NOTYPE2_16_PORT, DO_NOTYPE2_16_NO},
};

/*  函数功能：DI板卡数字量输入管脚初始化
 *  输入参数：无
 *  输出参数：无。
 *  返回值    ：
 *  使用注意：
 */
void drvIOInit_DI(void)
{
    int32_t i = 0;

    for (i = 0; i < DI_DRVC_LEN; i++)
    {
        drvIOSet_DRV_DI(i, 0);
    }

    drvIOSet_DIAGDRV_DI(1);
}


/*  函数功能：设置DI数字量输入模拟控制
 *  输入参数：uint32_t enable 1-关闭 0-开启
 *  输出参数：无。
 *  返回值 ：无
 *  使用注意：
 */
void drvIOSet_DIAGDRV_DI(uint32_t enable)
{
    gioSetBit(DIAG_DRV_1_PORT, DIAG_DRV_1_NO, enable);
    gioSetBit(DIAG_DRV_2_PORT, DIAG_DRV_2_NO, enable);
}
/*  函数功能：获取DI数字量输入模拟值
 *  输入参数：无
 *  输出参数：uint32_t *value 获取到的模拟值
 *  返回值 ：0 正常
 *          -1 入参异常
 *  使用注意：
 */
int32_t drvIOGet_DIAG_DI(uint32_t *value)
{
    int32_t ret = 0;

    if (value != NULL)
    {
        *value = gioGetBit(FD_DIAG_PORT, FD_DIAG_NO);
        ret = 0;
    }
    else
    {
        ret = -1;
    }

    return ret;
}

/*  函数功能：设置DI数字量输入控制
 *  输入参数：uint32_t DICtrlNum DI控制引脚通道号
 *           uint32_t value 输出电平值
 *  输出参数：无。
 *  返回值 ：0 正常
 *          -1 入参异常
 *  使用注意：
 */
int32_t drvIOSet_DRV_DI(uint32_t DICtrlNum, uint32_t value)
{
    int32_t ret = 0;

    if (DICtrlNum < DI_DRVC_LEN)
    {
        gioSetBit(DIConfigCtrl[DICtrlNum].port, DIConfigCtrl[DICtrlNum].pin, value);
    }
    else
    {
        printf("[%10llu] [%s %d] DICtrlNum err: %d\n\r", rit_Getms(), __FUNCTION__, __LINE__, DICtrlNum);
        ret = -1;
    }

    return ret;
}

/*  函数功能：获取DI数字量输入值
 *  输入参数：uint32_t DINum DI通道号
 *  输出参数：uint32_t *value 输出电平值
 *  返回值 ：0 正常
 *          -1 入参异常
 *  使用注意：
 */
int32_t drvIOGet_DI(uint32_t DINum, uint32_t *value)
{
    int32_t ret = 0;

    if ((DINum < DI_CHANNLE_LEN) && (value != NULL))
    {
        *value = gioGetBit(DIConfigIn[DINum].port, DIConfigIn[DINum].pin);
        ret = 0;
    }
    else
    {
        printf("[%10llu] [%s %d] err: DINum %d  value %p\n\r", rit_Getms(), __FUNCTION__, __LINE__, DINum, value);
        ret = -1;
    }

    return ret;
}

/*  函数功能：浮地检测
 *  输入参数：

 *  输出参数：无。
 *  返回值：
 *      0  - 正常
 *      -1  - 失败
 *  使用注意：无。
 */
int32_t drvEarthDetect_DI(void)
{
    int32_t ret = -1;
    uint32_t level = 0;
    level = gioGetBit(DI_EARTH_DETECT_PORT, DI_EARTH_DETECT_NO);

    if(0 == level)
    {
        ret = 0;
    }
    else
    {
        ret = -1;
    }

    return ret;
}

/*  函数功能：DO板卡数字量输出初始化
 *  输入参数：无
 *  输出参数：无。
 *  返回值    ：
 *  使用注意：
 */
void drvIOInit_DO(void)
{
    int32_t i = 0;

    for (i = 0; i < DO_CHANNLE_LEN; i++)
    {
        drvIOSet_DO(i, 0);
    }
}

/*  函数功能：设置DO数字量输出
 *  输入参数：uint32_t DONum DO输出通道号
 *           uint32_t value 输出电平值
 *  输出参数：无。
 *  返回值 ：0 正常
 *          -1 入参异常
 *  使用注意：
 */
int32_t drvIOSet_DO(uint32_t DONum, uint32_t value)
{
    int32_t ret = 0;

    if (DONum < DO_CHANNLE_LEN)
    {
        gioSetBit(DOConfigCtrl[DONum].port, DOConfigCtrl[DONum].pin, value);
        gioSetBit(DOConfigCtrl[DONum+DO_CHANNLE_LEN].port, DOConfigCtrl[DONum+DO_CHANNLE_LEN].pin, value);
    }
    else
    {
        printf("[%10llu] [%s %d] DONum err: %d\n\r", rit_Getms(), __FUNCTION__, __LINE__, DONum);
        ret = -1;
    }

    return ret;
}



